#ifndef __SEARCH_H_
#define __SEARCH_H_

#include "data.h"

void GoToCarage();
void OutOfCarage();
void StraightCross(int flag);
void InitVariate();
void IMAGE_MIDDLE_SET();
void CannySearch();
void SpecialCannySearch();
void StraightLine();
void DirctionControl(bool flag);
void OnlyOneEdge(int StartIndex, int EndIndex, char EdgeType, int Index);
void Search(bool flag);
int CharacterSearch();
int GetMiddleLine();
void Fliter();
void FarWings();
#define KEIL 0

/*----------------------- M A C R O S ----------------------------------------*/

/*********** 摄像头参数***********/
#define   MAX_VIDEO_POINT           162             //每行采集的点数
#define   MID_VIDEO_POINT           81              //图像中心点
#define   MAX_VIDEO_LINE	        60              //每场实际用到的行数

typedef struct      //图像数据结构  以左下角为坐标原点 向上为x，向右为y
{
	int16 x;
	int16 y;
}Int16_point;
typedef struct 		//向上为x向右为y 以(0,0)点为原点
{
	INT16S x;
	INT16S y;
}_POINT;


/*************图像处理***********/
#define   MAX_POINT_NUM                 80                  //边沿和中心最大个数
#define   WIDTH                         60                  //第一行白块宽度要求 根据前瞻以及看到的图像情况适当调整
#define   INIT_DATA			            250                 //无效数据

#define ClrBit(reg,bit)       reg &= ~(1 << bit)
#define SetBit(reg,bit)       reg |= (1 << bit)
#define ReverseBit(reg,bit)   reg ^= (1 << bit)
#define BitIsSet(reg,bit)     reg & (1 << bit)

#define Delay_T3_mS(x)			while(0);					//空语句(在上位机中不需要使用延时,也不需要赋P波值或者执行中断操作,故使用空语句代替)
#define SET_PWM_MOT(x)			while(0);					//空语句
#define DisableInterrupts()		while(0);					//空语句
#define LED_0_ON()				while(0);
#define LED_0_OFF()				while(0);

#define MIN(a,b)               ((a<b)?(a):(b))
#define MAX(a,b)               ((a>b)?(a):(b))
#define ABS(x)                 (((x)>0)?(x):(-(x)))

// 声明为外部变量，使外部的原文件可使用
extern uint8 g_VideoImageData[MAX_VIDEO_LINE][MAX_VIDEO_POINT];  //图像原始数据，g_VideoImageData[m][n]代表图像的从上数第m行，从左数第n点，0为最黑，255为最白
extern int8  target[MAX_VIDEO_LINE][MAX_VIDEO_POINT];
extern int   IMAGE_MIDDLE;
//==============================图像数据================================//
extern _POINT  g_CenterPosition[MAX_POINT_NUM];
extern _POINT  g_LeftEdge[MAX_POINT_NUM], g_RightEdge[MAX_POINT_NUM];
extern int          g_CenterNum;
extern int          g_LeftEdgeNum, g_RightEdgeNum;
extern int			g_DirectionControl;
extern int			CircleNeedRun; // 车子需要跑的圈数，默认是一圈
extern bool 		FlagLeftToCarage;
extern bool			FlagRightToCarage;  // 左右入库
extern bool			FlagLeftOutCarage;
extern bool			FlagRightOutCarage;  // 左右出库

#endif